#ifndef StrUtil_h
#define StrUtil_h

namespace str {

int Len(const char *s);
int Len(const WCHAR *s);

char  * Dup(const char *s);
WCHAR * Dup(const WCHAR *s);

bool Eq(const char *s1, const char *s2);
bool Eq(const WCHAR *s1, const WCHAR *s2);
bool EqI(const char *s1, const char *s2);
bool EqI(const WCHAR *s1, const WCHAR *s2);
bool EqN(const char *s1, const char *s2, size_t len);
bool EqN(const WCHAR *s1, const WCHAR *s2, size_t len);
bool EqNI(const char *s1, const char *s2, size_t len);
bool EqNI(const WCHAR *s1, const WCHAR *s2, size_t len);

bool StartsWithI(const char *str, const char *txt);
bool StartsWithI(const WCHAR *str, const WCHAR *txt);
bool EndsWith(const char *txt, const char *end);
bool EndsWith(const WCHAR *txt, const WCHAR *end);
bool EndsWithI(const char *txt, const char *end);
bool EndsWithI(const WCHAR *txt, const WCHAR *end);

char *  FmtV(const char *fmt, va_list args);
char *  Format(const char *fmt, ...);
WCHAR * FmtV(const WCHAR *fmt, va_list args);
WCHAR * Format(const WCHAR *fmt, ...);

char *  Join(const char *s1, const char *s2, const char *s3=NULL);
WCHAR * Join(const WCHAR *s1, const WCHAR *s2, const WCHAR *s3=NULL);

char  * ToMultiByte(const WCHAR *src, UINT codePage, int cchSrcLen=-1);
WCHAR * ToWideChar(const char  *src, UINT codePage, int cbSrcLen=-1);

namespace conv {

inline WCHAR * FromUtf8(const char *src) { return ToWideChar(src, CP_UTF8); }
inline WCHAR * FromAnsi(const char *src) { return ToWideChar(src, CP_ACP); }
inline char  * ToUtf8(const WCHAR *src) { return ToMultiByte(src, CP_UTF8); }
inline char  * ToAnsi(const WCHAR *src) { return ToMultiByte(src, CP_ACP); }

} // namespace str::conv

} // namespace str


char* MemToHexViewText(const unsigned char* pbyData, int nSize);

HRESULT MemToHexViewTextW(BYTE* pbyData, DWORD dwSize, WCHAR** ppwszHexViewText);

#endif // StrUtil_h